﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace WebPiket3Note
{
    /// <summary>
    /// Статический класс
    /// </summary>
    public class PrjProperty
    {

        #region Init() -- Инициализация журнала
        /// <summary>
        /// Инициализация журнала
        /// </summary>
        public static void Init()
        {
            Sources.SourcesInterface.piketJL = new Sources.PiketsJournal();
        } 
        #endregion Init()

        #region XMLSavePiketsJournal(string filename) -- Сохранение в XML
        /// <summary>
        /// Сохранение в XML
        /// </summary>
        /// <param name="filename"> Имя файла </param>
        public static void XmlSavePiketsJournal(string filename)
        {
            //Сохранение в XML
            //Создание файла
            using ( var file = File.CreateText(filename))
            {
                //Объект сереализации
                XmlSerializer ser = new XmlSerializer(typeof(Sources.PiketsJournal));

                //Сериализация данных
                ser.Serialize(file, Sources.SourcesInterface.piketJL);
            }
        }
        #endregion XMLSavePiketsJournal

        #region XMLLoadPiketsJournal(string filename) -- Чтение XML
        /// <summary>
        /// Чтение XML
        /// </summary>
        /// <param name="filename"> Имя файла </param>
        public static void XmlLoadPiketsJournal(string filename)
        {
            // Чтение XML
            //Открытие файла
            using ( var file = File.OpenText(filename))
            {
                //Объект сереализации / десереализации
                XmlSerializer ser = new XmlSerializer(typeof(Sources.PiketsJournal));

                //Создание XmlReader
                var xReader = XmlReader.Create(file);

                //Десереализация
                if (ser.CanDeserialize(xReader))
                {
                    Sources.SourcesInterface.piketJL = (Sources.PiketsJournal)ser.Deserialize(xReader);
                }

            }
        }
        #endregion XMLLoadPiketsJournal

        #region MyRegion CalculateDxDyDz(int curNo = -1) -- Пересчитать поля приращений для строк с флагом IsPiket
        /// <summary>
        /// Пересчитать поля приращений для строк с флагом IsPiket
        /// </summary>
        /// <param name="curNo">Номер текущей записи, если значение по умолчанию = -1, то считает все поля</param>
        public static void CalculateDxDyDz(int curNo = -1)
        {
            int i = 0;
            if (curNo == -1)
            {
                for (i = 0; i < Sources.SourcesInterface.piketJL.Pikets.Count; i++)
                {
                    if (Sources.SourcesInterface.piketJL.Pikets[i].IsPiket)
                    {
                        double ln = Sources.SourcesInterface.piketJL.Pikets[i].Length;
                        double az = Sources.SourcesInterface.piketJL.Pikets[i].Bearing;
                        double ug = Sources.SourcesInterface.piketJL.Pikets[i].Inc;

                        Sources.SourcesInterface.piketJL.Pikets[i].Dx = ln * Math.Cos((az - 90) * Math.PI / 180) * Math.Cos(ug * Math.PI / 180);
                        Sources.SourcesInterface.piketJL.Pikets[i].Dy = ln * Math.Sin((az - 90) * Math.PI / 180) * Math.Cos(ug * Math.PI / 180);
                        Sources.SourcesInterface.piketJL.Pikets[i].Dz = ln * Math.Sin(ug * Math.PI / 180);

                        /*
                            l := Длина;
                            az := Азимут;
                            ug  := Угол;

                            dx := l * Cos[(az - 90) * Pi / 180] * Cos[ug * Pi / 180];
                            dy := l * Sin[(az - 90) * Pi / 180] * Cos[ug * Pi / 180];
                            dz := l * Sin[ug * Pi / 180];
                            {dx, dy, dz}
                         */
                    }
                }
            }
            else
            {
                i = curNo;
                double ln = Sources.SourcesInterface.piketJL.Pikets[i].Length;
                double az = Sources.SourcesInterface.piketJL.Pikets[i].Bearing;
                double ug = Sources.SourcesInterface.piketJL.Pikets[i].Inc;

                Sources.SourcesInterface.piketJL.Pikets[i].Dx = ln * Math.Cos((az - 90) * Math.PI / 180) * Math.Cos(ug * Math.PI / 180);
                Sources.SourcesInterface.piketJL.Pikets[i].Dy = ln * Math.Sin((az - 90) * Math.PI / 180) * Math.Cos(ug * Math.PI / 180);
                Sources.SourcesInterface.piketJL.Pikets[i].Dz = ln * Math.Sin(ug * Math.PI / 180);
            }
        }

        #endregion CalculateDxDyDz

        #region double ToNumeric(string input) -- Перевод в double
        /// <summary>
        /// Перевод в double, если строка с ошибкой то возвращает 0.0
        /// </summary>
        public static double ToNumeric(string input)
        {
            double d = 0.0;
            try
            {
                string str;
                string separator = System.Globalization.CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator;

                str = input.Replace(".", separator);
                str = str.Replace(",", separator);
                d = double.Parse(str);
                return d;
            }
            catch
            {
                return 0;
            }
        }

        #endregion ToNumeric
    }
}
